Baner
; В начало ; Новости ; Теория ; Ресурсы ; Ссылки ; Форум ; Почта ;
Математика и физика
2D графика

   DirectDraw:
3D графика

   OpenGL:
Rambler's Top100 Rambler's Top100
Векторы
Вектор - это, пожалуй, наиболее часто используемый термин 3D графики. Чтобы создать хотя бы мало-мальски крупный 3D проект необходимо уметь пользоваться этими щтуковинами. В этом разделе будут рассмотрены основные операции над векторами, их свойства и использование.

Итак, чтоже такое вектор? Все очень просто, вектор - это направленный отрезок, имеющий начало и конец. В 3D графике используют вектора начинающиеся в точке с координатами (0, 0, 0). Векторами обычно обозначают скорость предметов или силы действующие на них. Вектор обладает двумя характеристиками: длина и направление. Чаще используют единичные вектора, т.е вектора с длиной равной единице. Простейшим способом включения векторов в вашу программу является введение следующей конструкции:

typedef struct
{
    float x, y, z;
} VECTOR;
Но если ограничиться лишь этой структурой, то использование векторов потеряет всякий смысл: все преимущество использования векторов заключается в возможности ими манипулировать. Далее описаны операции, которые можно производить с векторами.

Ч Определение модуля. Ш
VecMagnitude Также эту операцию называют Magnitude или Length, но в любом случае все это значит одно и то же - определение расстояния между начальной и конечной точками. А так как вектор начинается в точке (0, 0, 0), достаточно найти расстояние от конечной точки до начала координат.
|a|2 = x2 + y2 + z2

Ч Нормализация. Ш
VecNormalize Приводит вектор к единичному. Т.е длина вектора становится равна единице. Эта операция важна для использования некоторых операций, описанных далее.
ax = bx/ |b|
ay = by/ |b|
az = bz/ |b|

Ч Отрицание. Ш
VecNot Меняет направление вектора на противоположное. На рисунке -a = b.
ax = -ax
ay = -ay
az = -az

Ч Сложеие. Ш
VecSumm Результат сложения - на картинке. a + b = c. Сложение векторов может использоваться для определения результируещей силы, действующий на объект. Например, в одного человечка с двух разных сторон врезаются машинки... Куда полетит человечек? Сложим векторы скоростей машинок - узнаем.
cx = ax+bx
cy = ay+by
cz = az+bz

Ч Вычитание. Ш
VecSub Почти то же самое, что и сложение, только к первому вектору прибавляется вектор, обратный второму. Итог на картинке. a - b = c. Используется обычно для привязки системы координат к какому-нибудь движущемуся объекту, тогда вектор относительной скорости любого другого объекта будет равен разности вектора абсолютной скорости и вектора скорости того самого движущегося объекта.
cx = ax-bx
cy = ay-by
cz = az-bz

Ч Умножение на константу. Ш
VecMulConst Длина вектора увеличивается в k раз. На рисунке b = k * a.
bx = k*ax
by = k*ay
bz = k*az

Ч Скалярное произведение. Ш
VecMulScalar Англоязычный вариант этого термина звучит, как DotProduct. Итогом операции является число равное |a|*|b|*cos(alpha), где |a| и |b| длины умножаемых векторов, а cos(alpha) косинус угла между ними. Важным свойством операции является то, что если оба вектора единичны, то в результате получится просто cos(alpha). Если же единичен лишь один из них, то получится длина проекции другого на прямую, образуемую единичным.
a ^ b = ax*bx + ay*by + az*bz

Ч Векторное произведение. Ш
VecMulVec Англоязычный вариант этого термина звучит, как CrossProduct. Итогом операции является вектор перпендикулярный плоскости, образуемой перемножаемыми векторами. Операция используется для определения направления нормали, о которых рассказано в разделе "плоскости"; для определения координат многоугольников перпендикулярных направлению камеры, которые используются для создания спецэфектов; и для многого другого.
cx = ay*bz - az*by
cy = az*bx - ax*bz
cz = ax*by - ay*bx


Чтобы использовать все перечисленные операции необходимо создать для векторов специальный класс. Я написал пример такого класса.

Используются технологии uCoz